系统与共识¶
6.1 概述¶
本系统采用Akka-Actor做为模块实现基本组件,实现了系统创建、初始化、运行,进行全网共识并出块。 同时,对沙箱预执行模块和存储模块调用,完成整体的区块链系统功能。 主要分为系统创建及初始化、系统应用模块构建、区块数据同步、共识出块四大部分。
6.1.1系统创建及初始化¶
系统创建过程为:
- 根据需求创建单机单实例RepChain_Single,或者单机多实例RepChain。
- 根据1的需求创建指定数量的ClusterSystem实例。
- 通过ClusterSystem实例按照配置创建需要的API模块实例、分析统计模块实例、组网模块实例和应用模块管理实例。
- 应用模块继续构建各应用组件。
6.1.2 系统应用模型构建¶
- 负责系统安全相关的信任证书初始化、存储相关初始化、系统执行用各参数加载、系统用时间策略各参数加载。
- 创建各应用组件:持久化模块、同步模块、交易缓冲池、共识管理和辅助模块。
6.1.3区块数据同步¶
- 系统入网稳定后,进行区块链数据同步。
- 先同步,再交易。
6.1.4 共识¶
- 初始化共识配置。
- 构建共识模块。包括块模块、背书模块、合约容器、预执行模块和投票模块的构建。
- 初始化共识模块。
- 实现共识,保证系统正常出块并运行流畅。
6.2 系统与共识结构图¶
系统类的设计考虑到整体对Akka中Actor、Cluster的应用,以及针对一些功能进行拆分和抽象。设计了如下类关系,关系图如下所示。
(1)基础:
BaseActor: 继承Actor。主要负责actor地址、定时器的维护。
ClusterActor: 继承Actor。实现了与组网相关的基础功能,维护了订阅相关的实例。同时实现了actor在网络中的一些属性功能接口。
(2)日志:
RepLoging: 维护了log相关的实例,同时实现log相关的接口-包括记录log信息和操作时间戳。
(3)模块:
ModuleHelper: 继承Actor。维护了System级的共享变量接口(Extension),同时实现了模块相关的功能,维护了Actor注册的接口。
ModuleBase: 继承了ModuleHelper、ClusterActor、BaseActor和RepLogging。维护了日志相关的基础信息,同时重写了log相关的接口。作为系统功能模块的基础类。
(4)系统应用:
MemberListener: 继承ModuleHelper、RepLoging和ClusterActor,实现Akka分布式网络组网相关功能,包括入网、离网以及稳定节点整理。
StatisticCollection: 继承RepLogging,实现统计分析相关的功能。目前针对个操作时间、交易TPS进行了统计、分析和记录。
(5)共识:
BaseConsenter: 共识类的接口。主要定义了共识类的公共方法。
CRFD: 继承BaseConsenter。维护共识需要的模块。对其进行管理,例如创建、初始化和调用等。是共识部分的主要管理类。
![]()
各模块均继承ModuleBase,分别实现了各自的模块所需功能,关系如下图所示:
ModuleManager: 主要负责应用模块的创建和初始化。同时作为各System节点间下层模块交互的信息中转。
BlockModule: 块模块。负责进行交易打包(预出块)、块预执行提交、块预执行结果处理、块背书结果处理、新块入网、接收新块等功能。
EndorsementModule: 背书模块。负责对块内数据(交易及其结果)进行校验和背书。
PreloadTransactionModule: 预执行模块。负责对块内交易进行整理并向合约提交预执行申请,同时整理预执行结果并反馈。
PersistenceModule: 存储模块。负责对块数据进行持久化。与存储层进行交互。
SyncModule: 同步模块。针对本节点的存储(链数据)状态,和全网状态进行同步,并获得相关数据以及同步结果反馈。
CRFDVoterModule: CRFD共识的投票模块。实现了CRFD共识算法的投票功能。
PeerHelper: 辅助模块。现阶段主要负责自动构建交易对系统进行模拟测试。
![]()
ClusterSystem: 主要负责系统初始化(配置信息加载)、创建系统实例,并根据配置加入区块链分布式网络;按需构建API实例;启动RepChain系统并实例化各上层功能模块。
SystemProfile: 加载系统用相关参数数据(从配置中加载)
TimePolicy: 加载系统时间策略用相关参数数据(从配置中加载)
ConsensusManager: 共识管理类。根据配置构建共识模块并进行初始化。
ConfigerHelper: 各模块初始化实现接口,安全、存储、系统和时间策略参数的初始化和加载。
ActorRegister: actor引用的注册中心。主要为了在系统内部获得actor引用,进行消息传输。
ClusterHelper: 实现akka和RepChain分布式网络相关的接口实现。
BlockerHelper: 实现与区块相关的辅助功能接口实现。
PeerExtension: 系统System的共享内存实现。
6.3 系统与共识流程¶
该节主要详细介绍系统创建运行和共识相关的流程,如下图所示。
1) 根据配置和系统构建方式,构建clusterSystem实例。
- 初始化系统及应用配置信息。主要针对配置文件整合。
- 根据需求加入分布式集群网络。
- 根据需求开启API接口模块。
- 启动RepChain系统
- 启动EventServer
- 启动StatisticCollection
- 启动MemberListener。
- 启动ModuleManager,系统模块管理。
2) 系统应用模块启动。
进行初始化
- 信任证书初始化: 主要是读取节点自己的证书以及系统信任证书的数据,并载入系统。
- 存储初始化: 实例化基于该System的存储实例。
- 系统和时间策略初始化: 根据配置信息,将参数数据载入内存。
加载模块
- PersistenceModule
- SyncModule
- TransactionPool
- ConsensusManager
- PeerHelper
加载之后直接运行。
监听消息/事件
开启Actor消息监听
- 存储模块的数据同步请求,向出块人节点请求同步数据。
- 同步请求。收到其他节点的同步请求消息,将请求转至同步模块。
- 节点(自身)入网成功和共识初始化完成,改变状态,都成功则通知sync进行同步。
3) 交易缓冲池TransactionPool启动
- 订阅交易。
- 接收API或者内部辅助类生成的交易,验证并加入缓存中。按需触发重新投票条件检查的请求。想投票节点发送消息。
4) PeerHelper启动
- 通过对本地合约文件的读取,生成模拟的交易,广播到网络中,以便测试用。
5) PersistenceModule启动
- 接收存储块,验证通过后进行存储。块存储一定是按照顺序的,如果出现丢块的现象,达到一定条件后向出块人请求该高度的块数据(该信息通过ModuleManager进行中转)。
6) SyncModule启动
接收同步启动的消息。
向全网广播同步请求,获取各节点链信息。
接收各节点链信息,进行整理。将同步需求和结果发送至BlockModule
- 只有自己,则为种子节点。
- 与在网大多数节点数据相同,则直接开始投票。
- 与在网大多数节点数据不相同,则向其中任意节点按需索要数据。
接收同步数据请求,打包数据(多块或者单块)向索要人发送数据。同时在最后一个块传输中添加同步完成标识。
接收同步数据,并发送数据到存储模块。
接受同步完成标识,反馈同步状态。
同步超时。
- 如果未同步成功,则重新同步申请
- 同步成功则反馈同步状态
7) ConsensusManager启动
- 初始化共识。
- 根据配置生成共识。现阶段支持CRFD共识。
- 共识模块初始化。
- 开始共识。
- 接到共识初始化完成消息。并将结果反馈至ModuleManager。
8) CRFD共识执行
a)接收共识初始化的请求。开始对共识模块进行初始化。 b)初始化各共识模块
- 预执行模块
- 块模块
- 背书模块
- 投票模块
- 合约容器
c)接收块节点初始化完成消息(暂时,默认为共识均初始化完成)。发送到ConsensusManager。
9) 合约容器启动
a)接收交易,进行交易的执行。并返回交易执行结果。
10) 块模块启动
a)订阅背书块、新块。 b)接收投票节点发送的创建新块的请求,按需打包交易生成预备块,发给预执行模块进行预执行(该节点为出块人)。 c)接收投票节点发送的创建新块的通知(该节点为非出块人)。 d)接收预执行结果,确认成功后广播该背书块。 e)接收各个背书节点反馈的。确认成功后(满足背书条件),向块模块发送新块请求。 f)接收新块请求,广播块。新块入网。 g)接收新块。确认正确后将其发送至存储节点。同时向投票模块发送下一轮投票请求。 h)接收创世块创建请求。打包创世块,提交块到预执行模块。 i)接收创世块预执行结果。确认正确后提交至存储模块。同时向投票模块发送下一轮投票请求。 j)接收同步结果。根据不同情况进行处理
- 创世块创建。
- 进行下一次出块请求,即新的投票(发送至投票模块)。
k)出块超时
- 出块成功,不处理。
- 失败,触发下一次。
11) 背书模块启动
a)接收背书块,按配置进行背书 读写集检查,反馈背书结果。 完整交易检查(交易预执行结果),反馈背书结果(未实现,马上完善) a)执行预执行。 b)接收预执行结果,反馈。
12) 投票模块启动。
该模块是非常核心的模块。后续会继续完善。
接收下一轮投票消息。进行投票条件检测,满足条件。则发送出块触发消息(向自身)。
接收出块触发消息,进行候选人和出块人的选举。
- 如果选举不成功(条件不满足),空闲等待
- 成功,将结果反馈至块模块
该点为出块人。出块请求
该点为非出块人。出块通知
接收种子节点消息。将种子节点缓存。
接收回复投票消息。向自身发送重新检查投票条件的请求。将投票状态从将空闲等待状态恢复。
接收投票条件重新检查的消息,检查投票条件
- 满足,进行投票(b),结果反馈
- 不满足,继续等待
13) 预执行模块
接收预执行块,向合约提交需要预执行的交易。
接收各个交易的预执行结果。满足预执行结果的整合条件(全部反馈),将预执行结果反馈至预执行提交者。(这里,注意整合交易时确保交易是按照原序)。
预执行超时
- 成功
- 失败,反馈
![]()
其中,共识涉及到的详细算法,请详见共识算法的相关文件。


